/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import modelo.Factura;

/**
 *
 * @author Felipe
 */
public class FacturaDAO {

    private Connection conexion;

    public Connection getConexion() {
        return conexion;
    }

    public void setConexion(Connection conexion) {
        this.conexion = conexion;
    }

    public Factura buscar(String codigo) {
        Factura registro = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select *  from FACTURAS where COD_FACTURA = ?"; // idx :1
            sentencia = conexion.prepareStatement(sql);
            sentencia.setString(1, codigo);
            resultado = sentencia.executeQuery();

            if (resultado.next()) {
                registro = new Factura();

                registro.setCodFactura(resultado.getString("COD_FACTURA"));
                registro.setFecha(resultado.getTimestamp("FECHA"));
                registro.setCodProveedor(resultado.getInt("COD_PROVEEDOR"));
                registro.setFecha(resultado.getDate("FECHA"));
                registro.setTotal(resultado.getInt("TOTAL"));
                registro.setEstado(resultado.getBoolean("ESTADO"));

            }

        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("FacturaDAO.buscar: " + codigo, ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return registro;
    }

    public Collection<Factura> buscarTodos() {
        Collection<Factura> lista = new ArrayList<Factura>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select f.ESTADO,f.CORR_FACTURA,f.RUT_PROVEEDOR,f.FECHA,f.TOTAL,f.COD_FACTURA,f.DATE,p.NOMBRE from FACTURA f join PROVEEDOR p using (RUT_PROVEEDOR)  ORDER BY COD_FACTURA";
            sentencia = conexion.prepareStatement(sql);
            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    Factura registro = new Factura();

                    registro.setCorrFactura(resultado.getInt("CORR_FACTURA"));
                    registro.setCodFactura(resultado.getString("COD_FACTURA"));
                    registro.setFecha(resultado.getTimestamp("FECHA"));
                    registro.setCodProveedor(resultado.getInt("RUT_PROVEEDOR"));
                    registro.setNombre(resultado.getString("NOMBRE"));
                    registro.setTotal(resultado.getInt("TOTAL"));
                    
                registro.setEstado(resultado.getBoolean("ESTADO"));
                    lista.add(registro);
                }
            } catch (NullPointerException ex) {
                return null;

            }

        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("error al buscar todas las facturas", ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    public void Insertar(Factura fac) {
        PreparedStatement sentencia = null;
        java.sql.Date date = new java.sql.Date(fac.getFecha().getTime());
        try {
            String codFac = fac.getCodFactura();
            int corrFac = fac.getCorrFactura();
            int total = fac.getTotal();
            int prove = fac.getCodProveedor();

            String sql = "insert into FACTURA (CORR_FACTURA,RUT_PROVEEDOR,FECHA,TOTAL,COD_FACTURA,DATE) values(?,?,?,?,?,?)";
            sentencia = conexion.prepareStatement(sql);

            sentencia.setInt(1, corrFac);
            sentencia.setInt(2, prove);
            if (fac.getFecha() == null) {
                sentencia.setTimestamp(3, null);
            } else {
                long fechaEnMilisegundos = fac.getFecha().getTime();
                sentencia.setTimestamp(3, new Timestamp(fechaEnMilisegundos));
            }
            sentencia.setInt(4, total);
            sentencia.setString(5, codFac);
            sentencia.setDate(6, date);

            sentencia.executeUpdate();

        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("INSERTAR FAC", ex);
        } finally {
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }

        }

    }


    int getCorrFac() {
        PreparedStatement sentencia = null;
        int codigo = -11;
        ResultSet resultado = null;
        try {
            String sql = "SELECT MAX(CORR_FACTURA) AS CODIGO FROM FACTURA";
            sentencia = conexion.prepareStatement(sql);

            resultado = sentencia.executeQuery();
            if (resultado.next()) {
                codigo = (resultado.getInt("CODIGO") + 1);

            }

        } catch (SQLException ex) {
            throw new RuntimeException("error al buscar corr de factura", ex);

        }
        return codigo;
    }

    public Factura buscarPorNombre(String nombre) {
        PreparedStatement sentencia = null;
        Factura registro = null;
        ResultSet resultado = null;
        try {
            
            String sql = "select * from FACTURAS where COD_FACTURA like ?  ORDER BY COD_FACTURA  ";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setString(1, nombre);
            resultado = sentencia.executeQuery();
            if (resultado.next()) {
                registro = new Factura();
                registro.setCorrFactura(resultado.getInt("CORR_FACTURA"));
                registro.setCodFactura(resultado.getString("COD_FACTURA"));
                registro.setFecha(resultado.getTimestamp("FECHA"));
                registro.setCodProveedor(resultado.getInt("COD_PROVEEDOR"));
                registro.setTotal(resultado.getInt("TOTAL"));
                
                registro.setEstado(resultado.getBoolean("ESTADO"));
                
            }

        } catch (SQLException ex) {

        }
        return registro;

    }

    void anularPorCorr(int codigo) {
        
        PreparedStatement sentencia = null;
        try {
            String sql = "UPDATE FACTURA SET ESTADO = ? WHERE  CORR_FACTURA = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setBoolean(1, false);
            sentencia.setInt(2, codigo);
            sentencia.executeUpdate();

        } catch (SQLException ex) {
            throw new RuntimeException("error al anular factura", ex);

        }
    }

    Collection<Factura> buscarPorRut(int rut) {
        Collection<Factura> lista = new ArrayList<Factura>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;

        try {
            String sql = " select f.ESTADO, f.CORR_FACTURA, f.COD_FACTURA, f.FECHA, f.TOTAL, f.DATE, f.RUT_PROVEEDOR, p.NOMBRE from FACTURA f join PROVEEDOR p using (RUT_PROVEEDOR) where RUT_PROVEEDOR = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, rut);
            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    Factura registro = new Factura();
                    registro.setCodFactura(resultado.getString("COD_FACTURA"));
                    registro.setCorrFactura(resultado.getInt("CORR_FACTURA"));
                    registro.setFecha(resultado.getTimestamp("FECHA"));
                    registro.setCodProveedor(resultado.getInt("RUT_PROVEEDOR"));
                    registro.setTotal(resultado.getInt("TOTAL"));
                    registro.setNombre(resultado.getString("NOMBRE"));
                    
                registro.setEstado(resultado.getBoolean("ESTADO"));
                    // finalmente, agregar a la coleccion
                    lista.add(registro);
                }
            } catch (NullPointerException ex) {
                return null;

            }

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    Factura buscarPorCorr(int corrFac) {
        Factura registro = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select f.COD_FACTURA, f.FECHA, f.RUT_PROVEEDOR, f.FECHA, f.TOTAL, p.NOMBRE from FACTURA f join PROVEEDOR p using (RUT_PROVEEDOR) where CORR_FACTURA = ?"; // idx :1
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, corrFac);
            resultado = sentencia.executeQuery();

            if (resultado.next()) {
                registro = new Factura();

                registro.setCodFactura(resultado.getString("COD_FACTURA"));
                registro.setCorrFactura(corrFac);
                registro.setFecha(resultado.getTimestamp("FECHA"));
                registro.setCodProveedor(resultado.getInt("RUT_PROVEEDOR"));
                registro.setFecha(resultado.getDate("FECHA"));
                registro.setTotal(resultado.getInt("TOTAL"));
                registro.setNombre(resultado.getString("NOMBRE"));

            }

        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("FacturaDAO.buscar: " + corrFac, ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return registro;
    }

}
